package com.joysuch.wwyt.licence.service;

import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.joysuch.wwyt.core.entity.BaseMenuFunction;
import com.joysuch.wwyt.core.entity.BaseModuleMenuMapping;
import com.joysuch.wwyt.licence.bean.LicenceAnalysisDto;
import com.joysuch.wwyt.licence.bean.LicenceCacheDto;
import com.joysuch.wwyt.licence.bean.LicenceModuleAuthPageDto;
import com.joysuch.wwyt.licence.bean.LicenceModuleAuthRemindDto;
import com.joysuch.wwyt.licence.bean.LicencePageDto;
import com.joysuch.wwyt.licence.entity.Licence;
import com.joysuch.wwyt.licence.exception.LicenceException;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * licence表 服务类
 * </p>
 *
 * @author jialei
 * @since 2022-04-26
 */
public interface LicenceService extends IService<Licence> {

    /**
     * 基础模块配置关系缓存
     */
    TimedCache<String, Map<String, List<BaseModuleMenuMapping>>> BASE_MODULE_MENU_MAPPING_CACHE = CacheUtil.newTimedCache(30 * 60 * 1_000);

    /**
     * 分页查询
     *
     * @param page
     * @param size
     * @return
     */
    IPage<LicencePageDto> listPage(Integer page, Integer size);

    /**
     * 根据 licence code 查找 licence
     *
     * @param licence
     * @return
     */
    Licence getByLicenceCode(Long tenentId, String orgCode, String licence);

    /**
     * 分页查询授权模块
     *
     * @param page
     * @param size
     * @return
     */
    IPage<LicenceModuleAuthPageDto> listModuleAuthPage(Integer page, Integer size);

    /**
     * 获取授权模块到期提醒对象
     * @return key：到期时间（yyyy-MM-dd），value：模块名称 Set
     */
    List<LicenceModuleAuthRemindDto> listRemindModule();

    /**
     * 校验系统用户更新授权到期状态
     */
    void expired();

    /**
     * 刷新菜单黑名单缓存
     *
     * @param tenentId
     * @param orgCode
     * @param useCache
     * @return
     */
    Set<String> refreshBlackMenu(Long tenentId, String orgCode, boolean useCache);

    /**
     * 解析 licence 文件中的授权模块
     * 1.更新模块授权日期
     * 2.更新企业名称
     * 3.建筑id匹配（没有新增，有则校验是否一致）
     * @param licenceAnalysisDto
     * @return
     */
    void analysis(String licence, LicenceAnalysisDto licenceAnalysisDto) throws LicenceException;

    /**
     * 获取 licence 缓存对象
     *
     * @param tenentid
     * @param orgCode
     * @return
     */
    LicenceCacheDto getLicenceCacheDto(Long tenentid, String orgCode);

    /**
     * 根据 licence 过滤菜单
     * 注意：需要用户登录态
     *
     * @param baseMenuFunctionList
     * @return
     */
    List<BaseMenuFunction> filter(List<BaseMenuFunction> baseMenuFunctionList);

}
